//package il.technion.cs236369.threadPool;
//
//import il.technion.cs236369.exceptions.FullQueueException;
//import junit.framework.Assert;
//
//import org.junit.Test;
//
//public class ThreadPoolTests {
//	private static final int		NUMBER_OF_ITERATIONS	= 100;
//	private static final Integer	TIMEOUT					= null;
//
//	private static final class RunnableMission implements Runnable {
//		private final Mutator<Integer>	_lm;
//		private final int				_index;
//
//		private RunnableMission(Mutator<Integer> lm, int index) {
//			_lm = lm;
//			_index = index;
//		}
//
//		@Override
//		public void run() {
//			int current = _lm.getElement();
//			_lm.setElement(Math.max(current, _index));
//		}
//
//		@Override
//		public String toString() {
//			return "Mission " + _index;
//		}
//	}
//
//	private static class Mutator<T> {
//		private T	element;
//
//		public Mutator(T element) {
//			this.element = element;
//		}
//
//		public T getElement() {
//			return element;
//		}
//
//		public void setElement(T element) {
//			this.element = element;
//		}
//	}
//
//	@SuppressWarnings("unused")
//	@Test(expected = IllegalArgumentException.class)
//	public void ctorTest() throws Exception {
//		new ThreadPool(0, null, null);
//	}
//
//	@SuppressWarnings("unused")
//	@Test(expected = IllegalArgumentException.class)
//	public void ctorTest2() throws Exception {
//		new ThreadPool(-1, null, null);
//	}
//
//	@SuppressWarnings("unused")
//	@Test(expected = IllegalArgumentException.class)
//	public void ctorTest3() throws Exception {
//		new ThreadPool(-1, 0, null);
//	}
//
//	@SuppressWarnings("unused")
//	@Test(expected = IllegalArgumentException.class)
//	public void ctorTest4() throws Exception {
//		new ThreadPool(-1, -1, null);
//	}
//
//	@Test(expected = IllegalArgumentException.class)
//	public void runThreadsNullTest() throws Exception {
//		ThreadPool pool = new ThreadPool(1, null, null);
//		pool.run(null, null);
//	}
//
//	@Test
//	public void runThreadsTest() throws Exception {
//		final Mutator<Integer> lm = new Mutator<Integer>(0);
//		ThreadPool pool = new ThreadPool(1, TIMEOUT, null);
//		pool.run(new RunnableMission(lm, 1), null);
//		Thread.sleep(50);
//		Assert.assertEquals(new Integer(1), lm.getElement());
//	}
//
//	@Test
//	public void concurrentTasksTest() throws Exception {
//		final Mutator<Integer> lm = new Mutator<Integer>(0);
//		ThreadPool pool = new ThreadPool(1, TIMEOUT, null);
//		final Mutator<Integer> index = new Mutator<Integer>(0);
//		for (; index.getElement() < NUMBER_OF_ITERATIONS; index.setElement(index.getElement() + 1)) {
//			final int j = index.getElement();
//			pool.run(new Runnable() {
//				@Override
//				public void run() {
//					try {
//						Thread.sleep(10);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
//					lm.setElement(j + 1);
//				}
//
//				@Override
//				public String toString() {
//					return "Mission " + j;
//				}
//			}, null);
//		}
//		Thread.sleep(NUMBER_OF_ITERATIONS * 11);
//		Assert.assertEquals(new Integer(NUMBER_OF_ITERATIONS), lm.getElement());
//	}
//
//	@Test
//	public void serialTasksTest() throws Exception {
//		final Mutator<Integer> lm = new Mutator<Integer>(0);
//		ThreadPool pool = new ThreadPool(1, TIMEOUT, null);
//		final Mutator<Integer> index = new Mutator<Integer>(0);
//		for (; index.getElement() < NUMBER_OF_ITERATIONS; index.setElement(index.getElement() + 1)) {
//			Thread.sleep(10);
//			pool.run(new RunnableMission(lm, index.getElement() + 1), null);
//		}
//		Thread.sleep(10);
//		Assert.assertEquals(new Integer(NUMBER_OF_ITERATIONS), lm.getElement());
//	}
//
//	@Test
//	public void multipleThreadsTest() throws Exception {
//		final Mutator<Integer> lm = new Mutator<Integer>(0);
//		ThreadPool pool = new ThreadPool(10, TIMEOUT, null);
//		final Mutator<Integer> index = new Mutator<Integer>(0);
//		for (; index.getElement() < NUMBER_OF_ITERATIONS; index.setElement(index.getElement() + 1)) {
//			pool.run(new RunnableMission(lm, index.getElement() + 1), null);
//		}
//		Thread.sleep(NUMBER_OF_ITERATIONS * 10);
//		Assert.assertEquals(new Integer(NUMBER_OF_ITERATIONS), lm.getElement());
//	}
//
//	@Test
//	public void timeoutTests() throws Exception {
//		final Mutator<Integer> lm = new Mutator<Integer>(0);
//		ThreadPool pool = new ThreadPool(1, 10, null);
//		pool.run(new Runnable() {
//			@Override
//			public void run() {
//				try {
//					Thread.sleep(20);
//					lm.setElement(1);
//				} catch (InterruptedException e) {
//					e.printStackTrace();
//				}
//
//			}
//		}, null);
//		Thread.sleep(200);
//		Assert.assertEquals(new Integer(0), lm.getElement());
//	}
//
//	@Test(expected = FullQueueException.class)
//	public void fullQueueTestsFails() throws Exception {
//		ThreadPool pool = new ThreadPool(1, 10, 1);
//		for (int i = 0; i < 3; i++) {
//			pool.run(new Runnable() {
//				@Override
//				public void run() {
//					try {
//						Thread.sleep(1000);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
//				}
//			}, null);
//		}
//	}
//
//	@Test
//	public void fullQueueTestsRunTimeout() throws Exception {
//		final Mutator<Integer> lm = new Mutator<Integer>(0);
//		ThreadPool pool = new ThreadPool(1, 10, 1);
//		pool.run(new Runnable() {
//			@Override
//			public void run() {
//				try {
//					Thread.sleep(20);
//					lm.setElement(1);
//				} catch (InterruptedException e) {
//					e.printStackTrace();
//				}
//
//			}
//		}, new Runnable() {
//			@Override
//			public void run() {
//				lm.setElement(2);
//			}
//		});
//		Thread.sleep(200);
//		Assert.assertEquals(new Integer(2), lm.getElement());
//	}
//
//	@Test
//	public void fullQueueTestsPasses() throws Exception {
//		ThreadPool pool = new ThreadPool(1, 1000, 1);
//		final Mutator<Integer> lm = new Mutator<Integer>(0);
//		for (int i = 0; i < 10; i++) {
//			final int j = i;
//			pool.runOrWait(new Runnable() {
//				@Override
//				public void run() {
//					try {
//						Thread.sleep(50);
//						lm.setElement(lm.getElement() + 1);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
//
//				}
//
//				@Override
//				public String toString() {
//					return j + "";
//				}
//			}, null);
//		}
//
//		Thread.sleep(1000);
//		Assert.assertEquals(new Integer(10), lm.getElement());
//	}
//}
